package com.example.leo.mycharmingstudent.a0902;

import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Px;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.leo.mycharmingstudent.R;

import java.lang.ref.WeakReference;
import java.util.List;

public class ViewPagerActivity extends AppCompatActivity {

    private static final String TAG = "ViewPagerActivity";

    //图片翻页
    private ViewPager vpGuide;

    //引导图资源Id
    private int[] mImageIds = new int[]{
            R.mipmap.hero0,
            R.mipmap.hero1,
            R.mipmap.hero2,
            R.mipmap.hero3,
            R.mipmap.hero4,
    };
    private MyViewPagerAdapter mViewPagerAdapter;
    //指示器小圆点的容器布局
    private LinearLayout llIndicatorContainer;
    private MyHandler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager);

        findViews();
        initData();
        initEvent();

    }

    private void findViews() {
        vpGuide = findViewById(R.id.vp_guide_activity_view_pager);
        llIndicatorContainer = findViewById(R.id.ll_indicator_container_activity_view_pager);
    }

    private void initData() {
        /*
        向llIndicatorContainer里面添加相应数量的TextView
        TextView设置背景，背景就是刚才创建的selector
        注意：布局和控件可以使用xml形式创建，也可以使用代码创建
         */
        for (int index = 0; index < mImageIds.length; index++) {
            TextView tvIndicator = new TextView(this);
            tvIndicator.setBackgroundResource(
                    R.drawable.indicator_selector_view_pager_activity);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(40, 40);
            layoutParams.setMargins(0, 0, 20, 0);
            tvIndicator.setLayoutParams(layoutParams);
            //将TextView加入到线性布局中
            llIndicatorContainer.addView(tvIndicator);

            if (index == 0) {
                tvIndicator.setSelected(true);
            } /*else加不加都可以，因为默认就是未选中
            else {
                tvIndicator.setSelected(false);
            }*/
        }

    }

    private void initEvent() {
        mViewPagerAdapter = new MyViewPagerAdapter();
        //设置预加载的条目数量
        /*
           setOffscreenPageLimit需要注意两点：
           1.设置0无效，此处可以查看源码，比较简单
           2.根据设置的值，左右加载
           如果加载的位置小于0或者大于getCount()-1（最大角标），那就不加载了
           举个栗子：
           设置值为3，左边加载3条，右边加载3条，中间显示1条，共加载2*3+1
           设置值为n，左边加载n条，右边加载n条，中间显示1条，共加载2*n+1
         */
        vpGuide.setOffscreenPageLimit(2);
        vpGuide.setAdapter(mViewPagerAdapter);
        //setCurrentItem需要在设置adapter之后才会生效
        vpGuide.setCurrentItem(500_000_000);

        vpGuide.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    //手指按下
                    case MotionEvent.ACTION_DOWN:
                        mHandler.removeCallbacksAndMessages(null);
                        break;
                    //手指抬起
                    case MotionEvent.ACTION_UP:
                        mHandler.sendEmptyMessageDelayed(
                                MyHandler.MOVE_TO_NEXT,
                                3000);
                        break;
                }
                return false;
            }
        });

        mHandler = new MyHandler(this);
        /*Message obtain = Message.obtain();
        obtain.what = MyHandler.MOVE_TO_NEXT;
        obtain.obj = 500_000_001;
        mHandler.sendMessageDelayed(obtain, 3_000);*/
        mHandler.sendEmptyMessageDelayed(MyHandler.MOVE_TO_NEXT, 3000);

        vpGuide.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            /**
             * 监听界面滚动
             */
            @Override
            public void onPageScrolled(int i, float v, @Px int i1) {

            }

            /**
             * 当前选择/展示的页面位置
             * @param position 当前的位置
             */
            @Override
            public void onPageSelected(int position) {
                Log.e(TAG, String.format("real position:%d", position));
                /*
                当前位置的小点设置选中状态
                未选中的小点设置为未选中状态
                回忆过去：如果强转，最好使用instanceOf关键字判断
                 */
                int realPosition = position % mImageIds.length;
                for (int index = 0; index < mImageIds.length; index++) {
                    if (index == realPosition) {
                        TextView tvIndicator =
                                (TextView) llIndicatorContainer.getChildAt(index);
                        tvIndicator.setSelected(true);
                    } else {
                        TextView tvIndicator =
                                (TextView) llIndicatorContainer.getChildAt(index);
                        tvIndicator.setSelected(false);
                    }
                }

            }

            /**
             * 监听界面滚动状态
             * 举个栗子：
             * 从静止到滑动
             * 从滑动到静止
             */
            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });
    }

    /**
     * ViewPager预加载机制：
     * ViewPager默认最少会加载当前条目View（视图）的前一条和后一条。
     * <p>
     * ViewPager预加载机制  解释为什么数组越界
     * 前提：getCount() 返回 6
     * 1.当我加载第5个View（最后一个View）的时候，第6个View正在被实例化
     * 2.第6个View正在被实例化的时候，instantiateItem方法里面的position值是5
     * 3.mImageIds数组里面只有5个资源id，最大角标是4
     * 4.mImageIds数组最大角标是4，你给我个5，一定报错：ArrayIndexOutOfBoundsException
     */
    class MyViewPagerAdapter extends PagerAdapter {

        /**
         * 返回View的数量
         * 注意：如果数量超过列表或者数组的最大index（角标）
         * 会造成越界异常java.lang.ArrayIndexOutOfBoundsException。
         * <p>
         * getCount返回值 可以跟列表或数组进行关联
         * 举个栗子：
         * ViewPager总条目的数量，取决于图片的数量
         * so，getCount()可以直接返回mImageIds.length
         * <p>
         * 无线循环可以设置一个特别大的值
         */
        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        /**
         * 标准范式，这么整就对了
         * return view == object;
         */
        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
            return view == object;
        }

        /**
         * 实例化条目
         * 牵扯到实例化条目的流程介绍：
         * 1.使用LayoutInflater 充气（创建）一个View
         * 2.findViewById
         * 3.控件设置值
         * 某些个别方法的实现逻辑有需要注意的地方，
         * 直接根据上述流程进行调整
         */
        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container,
                                      int position) {
            /*
             实例化条目流程
             1.使用LayoutInflater 充气（创建）一个View
             2.return创建出来的View
             3.findViewById
             4.控件设置值
             5.不要忘记addView  container.addView(inflate);
             */
            View inflate = LayoutInflater.from(ViewPagerActivity.this)
                    .inflate(R.layout.item_view_pager, null, false);
            ImageView ivHero = inflate.findViewById(R.id.iv_hero_image_item_view_pager);
            TextView tvPosition = inflate.findViewById(R.id.tv_position_item_view_pager);
            ivHero.setImageResource(mImageIds[position % mImageIds.length]);
            tvPosition.setText(String.valueOf(position % mImageIds.length));
            container.addView(inflate);
            return inflate;
        }

        /**
         * 有创造就有毁灭
         * 不能只创建View，一直创建View会导致OOM内存溢出
         * so，这个方法就是用来销毁View
         */
        @Override
        public void destroyItem(@NonNull ViewGroup container,
                                int position,
                                @NonNull Object object) {
            container.removeView((View) object);
        }
    }

    private static class MyHandler extends Handler {


        private static final int MOVE_TO_NEXT = 10000;
        private WeakReference<ViewPagerActivity> mReference;

        private MyHandler(ViewPagerActivity activity) {
            mReference = new WeakReference<ViewPagerActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                //定义常量10000，表示播放下一张轮播图的任务
                case MOVE_TO_NEXT:
                    ViewPagerActivity activity = mReference.get();
                    if (activity != null) {
                        int currentItem = activity.vpGuide.getCurrentItem();
                        activity.vpGuide.setCurrentItem(currentItem + 1);
                        sendEmptyMessageDelayed(MOVE_TO_NEXT, 3000);

                        /*
                        此处有bug。当用手指滑动ViewPager的时候，
                        显示的当前条目，index值不对
                        解决方案：
                        1.当手指按下ViewPager的时候，撤回任务 removeMessages();
                        2.当手指离开ViewPager的时候，添加任务 sendMessageDelayed();
                         */
                        /*Message obtain = Message.obtain();
                        obtain.what = MOVE_TO_NEXT;
                        obtain.obj = itemIndex + 1;
                        sendMessageDelayed(obtain, 3_000);*/
                    }
                    break;
                default:
                    break;
            }
        }
    }
}
